home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / mach / sun3.md / bootSysAsm.s < prev    next >
Text File  |  1992-12-18  |  4KB  |  167 lines

  1. |* bootSys.s -
  2. |*
  3. |*     Contains code that is the first executed at boot time.
  4. |*
  5. |* Copyright (C) 1985 Regents of the University of California
  6. |* All rights reserved.
  7. |*
  8.  
  9. .data
  10. .asciz "$Header: /cdrom/src/kernel/Cvsroot/kernel/mach/sun3.md/bootSysAsm.s,v 9.0 89/09/12 14:51:17 douglis Stable $ SPRITE (Berkeley)"
  11. .even
  12. .text
  13.  
  14. #include "machConst.h"
  15.  
  16. |
  17. | "Start" is used for the -e option to the loader.  "SpriteStart" is
  18. | used for the prof module, which prepends an underscore to the name of
  19. | global variables and therefore can't find "_start".
  20. |
  21.  
  22.     .text
  23.     .globl    start
  24.     .globl    _spriteStart
  25. start:
  26. _spriteStart:
  27.     movw    #MACH_SR_HIGHPRIO,sr        | lock out interrupts
  28. |
  29. | The function codes are only used to get to and from MMU space so set them
  30. | permanently here.
  31. |
  32.     movl    #VMMACH_MMU_SPACE, d0
  33.     movc    d0, dfc
  34.     movc    d0, sfc
  35. #ifdef sun2
  36. |
  37. | The kernel has been loaded into the wrong location.  We copy it to the right
  38. | location by copying up 4 Meg worth of pmegs starting at address 10M.
  39. |
  40.     clrl    d0
  41.     movl    #(MACH_KERN_START + VMMACH_SEG_MAP_OFF), a0
  42. loopStart:
  43.     movsb    d0, a0@
  44.     addql    #1, d0
  45.     addl    #VMMACH_SEG_SIZE, a0
  46.     cmpl    #(0x400000 / VMMACH_SEG_SIZE), d0
  47.     bne    loopStart
  48.  
  49. #endif
  50.  
  51. #ifdef sun3
  52. |
  53. | The kernel has been loaded into the wrong location.  We copy it to the right
  54. | location by copying up 8 Meg worth of pmegs.  This is done in all contexts.
  55. |
  56.  
  57.     clrl    d1
  58. contextLoop:
  59.     movsb    d1, VMMACH_CONTEXT_OFF
  60.     clrl    d0
  61.     movl    #(MACH_KERN_START + VMMACH_SEG_MAP_OFF), a0
  62. loopStart:
  63.     movsb    d0, a0@
  64.     addql    #1, d0
  65.     addl    #VMMACH_SEG_SIZE, a0
  66.     cmpl    #(0x800000 / VMMACH_SEG_SIZE), d0
  67.     bne    loopStart
  68.  
  69.     addql    #1, d1
  70.     cmpl    #VMMACH_NUM_CONTEXTS, d1
  71.     bne     contextLoop
  72.  
  73.     clrl    d1
  74.     movsb    d1, VMMACH_CONTEXT_OFF
  75.  
  76. |
  77. | Enable the mc68881 floating point coprocessor.
  78. |
  79.  
  80.         .data
  81.  
  82.     .globl _mach68881Present
  83. _mach68881Present:
  84.     .long   1
  85.  
  86.         .globl _mach68881NullState
  87. _mach68881NullState:
  88.     .long   0
  89.  
  90.         .globl _mach68881IdleState
  91.         .globl _mach68881Version
  92. _mach68881IdleState:
  93. _mach68881Version:
  94.     .long   0
  95.     .long   0
  96.     .long   0
  97.     .long   0
  98.     .long   0
  99.     .long   0
  100.     .long   0
  101.  
  102.     .text
  103.  
  104.         movsb   VMMACH_SYSTEM_ENABLE_REG, d0    | Read the enable register.
  105.     orb     #MACH_ENABLE_FPP, d0            | Set the fpu enable bit.
  106.     movsb   d0, VMMACH_SYSTEM_ENABLE_REG    | Write the enable register.
  107.     movl    (MACH_EMU1111*4), d1            | Save current inrpt 11 handler.
  108.     movl    #fcatch, (MACH_EMU1111*4)       | Set up to catch a trap.
  109.     movl    sp, a0                          | Save sp, just in case.
  110.     frestore _mach68881NullState            | Set the fpu to the null state.
  111.                                             | If there is no fpu we will
  112.                         | trap to `fcatch'.
  113.     fmovecrx    #0, fp1                     | Set fp register.
  114.     movw    #0x100, d0
  115. 2:
  116.     dbra    d0, 2b                          | Wait for fpu op to complete.
  117.     fsave   _mach68881IdleState             | Save an idle state frame.
  118.     frestore _mach68881NullState            | Reset the fpu to null state.
  119.     bra     1f
  120. fcatch:                                         | Oops, there isn't any fpu.
  121.     movl    a0, sp                          | Restore the stack,
  122.     andb    #~MACH_ENABLE_FPP, d0           | Clear the fpu enable bit.
  123.     movsb   d0, VMMACH_SYSTEM_ENABLE_REG    | Write the enable register.
  124.     clrl    _mach68881Present               | Clear the fpu present flag.
  125. 1:
  126.     movl    d1, (MACH_EMU1111*4)            | Restore the inrpt 11 handler.
  127. #endif
  128.  
  129. |
  130. | Force non-PC relative jump to real start of kernel.
  131. |
  132.  
  133.     jmp    begin:l
  134.  
  135. |
  136. | Trap to the debugger.  Used when need to trap via the monitor.
  137. |
  138.  
  139.     .globl _Dbg_Mon
  140. _Dbg_Mon:    
  141.     trap #15
  142.  
  143.     .globl _edata, _end
  144. begin:
  145. |
  146. | Zero out the bss segment.
  147. |
  148.     movl    #_edata, a0
  149.     movl    #_end, a1
  150. 1:
  151.     clrl    a0@
  152.     addql    #4, a0
  153.     cmpl    a0, a1
  154.     bne    1b
  155.  
  156.     movl    #start,sp        | Set the stack pointer
  157.      movl    #start,_dbgMaxStackAddr    | Store the top of the stack for the
  158.                     |     debugger.
  159.     jsr    _main
  160.  
  161. | We returned so call Proc_Exit
  162. |
  163.  
  164.     clrl    sp@-
  165.     jsr    _Proc_Exit
  166.